package com.rock.sys.intercept;

import com.eova.aop.AopContext;
import com.jfinal.plugin.activerecord.Db;
import com.rock.sys.global.RockMetaIntercept;

import cn.hutool.core.util.StrUtil;

public class AppRoleIntercept extends RockMetaIntercept {
	/**
     * 新增前置任务(事务内) ，添加默认执行方法（新增字段处理）
     * <pre>
     * ac.record 当前操作数据
     * -------------
     * 用法：自动赋值
     * ac.record.set("reg_time", new Date());
     * ac.record.set("user_id", ac.user.get("id"));
     *
     * 用法：唯一值判定
     * int count = Db.queryInt("select count(*) from users where name = ?", ac.record.getStr("name"));
     * if (count > 0) {
     *     return Easy.error("名字不能重复");
     * }
     * </pre>
     */
	@Override
    public String addBefore(AopContext ac) throws Exception {
		String r = super.addBefore(ac);
		if(!StrUtil.isBlankIfStr(r)) {
			return r;
		}

    	String appId = ac.record.getStr("app_id");
    	Boolean isDefault = ac.record.getBoolean("is_default");

    	//检查APP默认角色是否存在
        int count = Db.queryInt("select count(*) from t_s_app_role where app_id = ? and is_default='1'", appId);
        
        //创建默认角色时判断是否已存在
    	if(isDefault) {
    		if(count != 0) {
            	return "已经存在APP默认角色，无法创建";
            }
    	}

    	//创建非默认角色时判断是否已存在
    	if(!isDefault) {
        	//检查APP默认角色是否存在
    		if(count == 0) {
            	return "必须先创建APP默认角色";
            }
    	}

    	//元数据编码有值时，检查APP下元数据编码是否已存在
    	if(StrUtil.isNotBlank(ac.record.getStr("meta_code"))) {
    		int mcount = Db.queryInt("select count(*) from t_s_app_role where app_id = ? and meta_code=?", appId, ac.record.getStr("meta_code"));
    		if(mcount > 0) {
    			return "操作失败：该APP下已存在相同的元数据编码";
    		}
    	}
        
        return null;
    }
	
	@Override
    public String updateBefore(AopContext ac) throws Exception {
		String r = super.updateBefore(ac);
		if(!StrUtil.isBlankIfStr(r)) {
			return r;
		}

    	String appId = ac.record.getStr("app_id");
    	String id = ac.record.getStr("id");
    	String metaCode = ac.record.getStr("meta_code");
    	String metaCodeReg = ac.record.getStr("meta_code_reg");
    	
    	if(StrUtil.isNotBlank(metaCode)) {
    		//检查APP下绑定元数据编码是否已存在
    		int mcount = Db.queryInt("select count(*) from t_s_app_role where app_id = ? and meta_code=? and id<>?", appId, metaCode, id);
    		if(mcount > 0) {
    			return "操作失败：该APP下已存在相同的绑定元数据编码";
    		}
    	}
    	if(StrUtil.isNotBlank(metaCodeReg)) {
    		//检查APP下注册元数据编码是否已存在
    		int mcount = Db.queryInt("select count(*) from t_s_app_role where app_id = ? and meta_code_reg=? and id<>?", appId, metaCodeReg, id);
    		if(mcount > 0) {
    			return "操作失败：该APP下已存在相同的注册元数据编码";
    		}
    	}
        
        return null;
    }
    

    /**
     * 删除前置任务(事务内)
     * <pre>
     * ac.record    当前删除对象数据
     * -------------
     * 用法：删除前置检查
     * </pre>
     */
	@Override
    public String deleteBefore(AopContext ac) throws Exception {
		String r = super.deleteBefore(ac);
		if(!StrUtil.isBlankIfStr(r)) {
			return r;
		}
		
    	String appId = ac.record.getStr("app_id");
    	String isDefault = ac.record.getStr("is_default");
        
        //必须最后删除默认角色
    	if(isDefault.equals("1")) {
        	//检查APP是否存在其他角色
            int count = Db.queryInt("select count(*) from t_s_app_role where app_id = ? and is_default<>'1'", appId);
    		if(count != 0) {
            	return "存在其他APP角色，无法删除默认角色";
            }
    	}
		
        return null;
    }

    /**
     * 删除后置任务(事务内)
     * <pre>
     * ac.record    当前删除对象数据
     * -------------
     * 用法：级联删除，父对象删除时级联删除子对象，同一个事务内
     * </pre>
     */
	@Override
    public String deleteAfter(AopContext ac) throws Exception {
		String r = super.deleteAfter(ac);
		if(!StrUtil.isBlankIfStr(r)) {
			return r;
		}
		
		//同步删除角色授权的页面组件
		String id = ac.record.getStr("id");
		Db.delete("delete from t_s_app_role_comps where rid=?", id);
		
        return null;
    }
}
